home *** CD-ROM | disk | FTP | other *** search
Text File | 1997-08-18 | 22.9 KB | 684 lines | [TEXT/R*ch] |
-
- open List Fnlib Mixture Const Smlexc Smlprim Globals Location;
- open Units Types Asynt Asyntfn Primdec Infixst Synchk;
-
- fun lookup_iBas (iBas : InfixBasis) id =
- lookupEnv iBas id
- handle Subscript => NONFIXst
- ;
-
- fun lookup_cBasForPat cBas (ii : IdInfo) =
- let val { qualid, info } = ii
- val { idLoc, ... } = info
- in
- findInfo conBasisOfSig cBas idLoc qualid
- (* Otherwise ii is being defined it the pattern... *)
- handle Subscript => { qualid=qualid, info=VARname REGULARo }
- end
- ;
-
- fun lookup_cBas cBas (ii : IdInfo) =
- let val { qualid, info } = ii
- val { idLoc, ... } = info
- in
- findInfo conBasisOfSig cBas idLoc qualid
- handle Subscript =>
- errorMsg idLoc ("Unbound value identifier: " ^ showQualId qualid)
- end
- ;
-
- fun asId_Exp (_, VARexp(ref (RESve ii))) =
- let val { qualid, info } = ii in
- if #qual qualid <> "" orelse #withOp info then NONE else SOME ii
- end
- | asId_Exp (_, _) = NONE
- ;
-
- fun applyId_Exp (ii : IdInfo) exp =
- let val { qualid, info } = ii
- val { idLoc, ... } = info
- in
- (xLR exp, APPexp((idLoc, VARexp(ref (RESve ii))), exp))
- end
- ;
-
- fun applyObj_Exp exp1 exp2 = (xxLR exp1 exp2, APPexp(exp1, exp2));
-
- val theExpStack =
- {
- pair=pairExp, asId=asId_Exp,
- applyId=applyId_Exp, applyObj=applyObj_Exp
- };
-
- fun resolveInfixExp (iBas : InfixBasis) loc exps =
- resolveInfix theExpStack (lookup_iBas iBas) exps
- handle WrongInfix =>
- errorMsg loc "Ill-formed infix expression"
- | MixedAssociativity =>
- errorMsg loc "Mixed left- and right-associative operators of equal precedence"
- ;
-
- fun asId_Pat (_, VARpat ii) =
- let val { qualid, info } = ii in
- if #qual qualid <> "" orelse #withOp info then NONE else SOME ii
- end
- | asId_Pat (_, _) = NONE
- ;
-
- fun applyId_Pat ii pat = (xLR pat, CONSpat(ii, pat ));
-
- fun applyObj_Pat pat1 pat2 =
- case pat1 of
- (_, VARpat ii) => (xxLR pat1 pat2, CONSpat(ii, pat2))
- | (loc, _) => errorMsg loc "Non-identifier applied to a pattern"
- ;
-
- val thePatStack =
- {
- pair=pairPat, asId=asId_Pat,
- applyId=applyId_Pat, applyObj=applyObj_Pat
- }
- ;
-
- fun resolveInfixPat iBas loc pats =
- resolveInfix thePatStack (lookup_iBas iBas) pats
- handle WrongInfix =>
- errorMsg loc "Ill-formed infix pattern"
- | MixedAssociativity =>
- errorMsg loc "Mixed left- and right-associative operators of equal precedence"
- ;
-
- fun addCon cs (cBas : ConBasis) =
- let val {qualid, info} = cs in
- bindInEnv cBas (#id qualid) { qualid=qualid, info=CONname info }
- end
- ;
-
- fun addExCon (id, cs) (cBas : ConBasis) =
- let val {qualid, info} = cs in
- bindInEnv cBas id { qualid= qualid, info=EXNname info }
- end
- ;
-
- fun addVar id (cBas : ConBasis) =
- let val q = mkGlobalName id
- val vi = { qualid=q, info=REGULARo }
- in bindInEnv cBas id { qualid=q, info=VARname REGULARo } end
- ;
-
- fun addPrimVal (id, cs) (cBas : ConBasis) =
- bindInEnv cBas id cs
- ;
-
- fun addPatVars pat cBas = foldL addVar cBas (domPat pat);
-
- fun errorVarAsCon (ii : IdInfo) =
- errorMsg (#idLoc (#info ii)) "A constructor name expected"
- ;
-
- fun errorPrimAsCon (ii : IdInfo) =
- errorMsg (#idLoc (#info ii)) "A constructor name expected"
- ;
-
- fun resolvePatCon (cBas : ConBasis) (pat as (loc, pat')) =
- case pat' of
- SCONpat _ => pat
- | VARpat ii =>
- let val cs = lookup_cBasForPat cBas ii
- val {qualid, info} = ii
- in
- case #info cs of
- VARname _ =>
- (if #qual qualid <> "" then
- errorMsg (#idLoc info)
- "Variable names in patterns cannot be qualified"
- else ();
- pat)
- | PRIMname _ =>
- (if #qual qualid <> "" then
- errorMsg (#idLoc info)
- "Variable names in patterns cannot be qualified"
- else ();
- pat)
- | CONname ci =>
- (if #conArity(!ci) <> 0 then
- errorMsg (#idLoc info)
- "Unary constructor in the pattern needs an argument"
- else ();
- #idKind info := { qualid= #qualid cs, info=CONik ci };
- (loc, NILpat ii))
- | EXNname ei =>
- (if #exconArity(!ei) <> 0 then
- errorMsg (#idLoc info)
- "Unary exception constructor in the pattern needs an argument"
- else ();
- #idKind info := { qualid= #qualid cs, info=EXCONik ei };
- (loc, EXNILpat ii))
- | REFname =>
- errorMsg (#idLoc info) "`ref` is used as a variable"
- end
- | WILDCARDpat => pat
- | NILpat ii => fatalError "resolvePatCon"
- | CONSpat(ii, p) =>
- let val cs = lookup_cBasForPat cBas ii
- val {qualid, info} = ii
- in
- case #info cs of
- VARname _ => errorVarAsCon ii
- | PRIMname _ => errorPrimAsCon ii
- | CONname ci =>
- (if #conArity(!ci) = 0 then
- errorMsg (#idLoc info)
- "Nullary constructor in a pattern cannot be applied"
- else ();
- #idKind info := { qualid= #qualid cs, info=CONik ci };
- (loc, CONSpat(ii, resolvePatCon cBas p)))
- | EXNname ei =>
- (#idKind info := { qualid= #qualid cs, info=EXCONik ei };
- (loc, EXCONSpat(ii, resolvePatCon cBas p)))
- | REFname => (loc, REFpat (resolvePatCon cBas p))
- end
- | EXNILpat _ => fatalError "resolvePatCon"
- | EXCONSpat _ => fatalError "resolvePatCon"
- | EXNAMEpat _ => fatalError "resolvePatCon"
- | REFpat _ => fatalError "resolvePatCon"
- | RECpat(ref (RECrp(fs, dots))) =>
- (loc, RECpat(ref (RECrp(map_fields (resolvePatCon cBas) fs, dots))))
- | RECpat(ref (TUPLErp _)) => fatalError "resolvePatCon"
- | VECpat ps =>
- (loc, VECpat (map (resolvePatCon cBas) ps))
- | PARpat p =>
- (loc, PARpat (resolvePatCon cBas p))
- | INFIXpat _ => fatalError "resolvePatCon"
- | TYPEDpat(p,t) =>
- (loc, TYPEDpat(resolvePatCon cBas p, t))
- | LAYEREDpat(pat1, pat2) =>
- (loc, LAYEREDpat(resolvePatCon cBas pat1, resolvePatCon cBas pat2))
- ;
-
- fun resolvePatOp (iBas : InfixBasis) (pat as (loc, pat')) =
- case pat' of
- SCONpat _ => pat
- | VARpat _ => pat
- | WILDCARDpat => pat
- | NILpat _ => fatalError "resolvePatOp"
- | CONSpat(ii, p) => (loc, CONSpat(ii, resolvePatOp iBas p))
- | EXNILpat _ => fatalError "resolvePatOp"
- | EXCONSpat _ => fatalError "resolvePatOp"
- | EXNAMEpat _ => fatalError "resolvePatOp"
- | REFpat _ => fatalError "resolvePatOp"
- | RECpat(ref (RECrp(fs, dots))) =>
- (loc, RECpat(ref (RECrp(map_fields (resolvePatOp iBas) fs, dots))))
- | RECpat(ref (TUPLErp _)) => fatalError "resolvePatOp"
- | VECpat ps => (loc, VECpat (map (resolvePatOp iBas) ps))
- | PARpat p => (loc, PARpat (resolvePatOp iBas p))
- | INFIXpat ps =>
- resolveInfixPat iBas loc (map (resolvePatOp iBas) ps)
- | TYPEDpat(p,t) =>
- (loc, TYPEDpat(resolvePatOp iBas p, t))
- | LAYEREDpat(pat1, pat2) =>
- let val pat1' = resolvePatOp iBas pat1
- val pat2' = resolvePatOp iBas pat2
- in
- (loc, LAYEREDpat(pat1', pat2'))
- end
- ;
-
- fun isInfix iBas id =
- case lookup_iBas iBas id of
- INFIXst _ => true
- | INFIXRst _ => true
- | NONFIXst => false
- ;
-
- fun patOfIdent (ii : IdInfo) =
- (#idLoc (#info ii), VARpat ii)
- ;
-
- fun checkNoInfixes iBas (loc, pat') =
- case pat' of
- VARpat{qualid={qual="", id=id}, info={withOp=false, ...}} =>
- if isInfix iBas id then
- errorMsg loc "Ill-placed infix in a fun clause"
- else ()
- | _ => ()
- ;
-
- fun mergeFCIds [] = fatalError "mergeFCIds"
- | mergeFCIds [(ii, cl)] = (ii, [cl])
- | mergeFCIds ((ii, cl) :: rest) =
- let val (ii', cls) = mergeFCIds rest in
- if #id(#qualid ii) <> #id(#qualid ii') then
- errorMsg (#idLoc (#info ii')) "Different function names in clauses"
- else ();
- (ii : IdInfo, cl::cls)
- end
- ;
-
- datatype 'a Category = INFIXED of 'a | OTHER;
-
- fun categorize iBas (_, pat') =
- case pat' of
- VARpat {info={withOp=true, ...}, ...} => OTHER
- | VARpat (ii as {qualid={qual="", id=id}, info={withOp=false, ...}}) =>
- if (isInfix iBas id) then (INFIXED ii) else OTHER
- | _ => OTHER
- ;
-
- fun resolveFClauseArgs iBas (pats : Pat list) =
- case map (categorize iBas) pats of
- [OTHER, INFIXED ii, OTHER] =>
- (* SUCCESS: case (4) *)
- (case pats of
- [ap1,_,ap2] => (ii, [pairPat ap1 ap2])
- | _ => fatalError "resolveFClauseArgs")
- | OTHER :: _ =>
- (* Try for cases (1)/(2)/(3) *)
- (case pats of
- (_, PARpat(_, INFIXpat [ap1,ap2,ap3])) :: rest =>
- (* Try for case (3) *)
- (case categorize iBas ap2 of
- INFIXED ii =>
- (* SUCCESS: case (3) *)
- (ii, pairPat ap1 ap3 :: rest)
- | OTHER =>
- (* `fun (<ap1> <junk> <ap2>)' *)
- errorMsg (xLR ap2)
- "Expecting infixed identifier")
- | fst :: snd :: rest =>
- (* Try for cases (1)/(2)... *)
- (case fst of
- (_, VARpat ii) =>
- (* ii can't be an infix, because it matches OTHER *)
- (ii, snd :: rest)
- | (_, _) =>
- (* `fun <junk> <junk> ...' *)
- errorMsg (xxLR fst snd) "Ill-formed clause start")
- | _ =>
- (* `fun <ap> = ...' *)
- errorMsg (xLR (hd pats))
- "Ill-formed left hand side of a clause")
- | _ =>
- (* `fun +' or something *)
- errorMsg (xLR (hd pats))
- "Expecting function name or infix pattern"
- ;
-
- fun resolveFClause iBas (FClause(pats, exp)) =
- let val (ii, args) = resolveFClauseArgs iBas pats
- val () = app (checkNoInfixes iBas) args
- val args' = map (resolvePatOp iBas) args
- val exp' = resolveExpOp iBas exp
- in (ii, MRule(args', exp')) end
-
- and resolveFClauseList iBas fclauses =
- mergeFCIds (map (resolveFClause iBas) fclauses)
-
- and resolveFValBind iBas (loc, fclauses) =
- let val (ii, (mrules : Match)) =
- resolveFClauseList iBas fclauses
- val numArgs = curriedness mrules
- in
- app (fn MRule(pats,_) =>
- if numArgs <> List.length pats then
- errorMsg loc "Mismatch in the number of curried arguments"
- else ())
- mrules;
- ValBind(patOfIdent ii, (loc, FNexp mrules))
- end
-
- and resolveExpOp iBas (exp as (loc, exp')) =
- case exp' of
- SCONexp _ => exp
- | VARexp _ => exp
- | FNexp mrules =>
- (loc, FNexp (map (resolveMRuleOp iBas) mrules))
- | APPexp(e1, e2) =>
- (loc, APPexp(resolveExpOp iBas e1, resolveExpOp iBas e2))
- | LETexp(dec, body) =>
- let val (iBas', dec') = resolveDecOp iBas dec in
- (loc, LETexp(dec', resolveExpOp (plusEnv iBas iBas') body))
- end
- | RECexp(ref (RECre fs)) =>
- (loc, RECexp(ref (RECre(map_fields (resolveExpOp iBas) fs))))
- | RECexp(ref (TUPLEre _)) =>
- fatalError "resolveExpOp"
- | VECexp es =>
- (loc, VECexp (map (resolveExpOp iBas) es))
- | PARexp e =>
- (loc, PARexp (resolveExpOp iBas e))
- | INFIXexp es =>
- resolveInfixExp iBas loc (map (resolveExpOp iBas) es)
- | TYPEDexp(e, ty) =>
- (loc, TYPEDexp(resolveExpOp iBas e, ty))
- | ANDALSOexp(e1, e2) =>
- (loc, ANDALSOexp(resolveExpOp iBas e1, resolveExpOp iBas e2))
- | ORELSEexp(e1, e2) =>
- (loc, ORELSEexp(resolveExpOp iBas e1, resolveExpOp iBas e2))
- | HANDLEexp(e, mrules) =>
- (loc, HANDLEexp(resolveExpOp iBas e, map (resolveMRuleOp iBas) mrules))
- | RAISEexp e =>
- (loc, RAISEexp (resolveExpOp iBas e))
- | IFexp(e0, e1, e2) =>
- (loc, IFexp(resolveExpOp iBas e0, resolveExpOp iBas e1,
- resolveExpOp iBas e2))
- | WHILEexp(e1, e2) =>
- (loc, WHILEexp(resolveExpOp iBas e1, resolveExpOp iBas e2))
- | SEQexp(e1,e2) =>
- (loc, SEQexp(resolveExpOp iBas e1, resolveExpOp iBas e2))
-
- and resolveMRuleOp iBas (MRule(pats,exp)) =
- MRule(map (resolvePatOp iBas) pats, resolveExpOp iBas exp)
-
- and resolveDecOp (iBas : InfixBasis) (dec as (loc, dec')) =
- case dec' of
- VALdec (tvs, (pvbs, rvbs)) =>
- (NILenv, (loc, VALdec (tvs, (map (resolveValBindOp iBas) pvbs,
- map (resolveValBindOp iBas) rvbs))))
- | PRIM_VALdec _ => (NILenv, dec)
- | FUNdec (tvs, fvbs) =>
- (NILenv, (loc, VALdec (tvs, ([], map (resolveFValBind iBas) fvbs))))
- | TYPEdec _ => (NILenv, dec)
- | PRIM_TYPEdec _ => (NILenv, dec)
- | DATATYPEdec _ => (NILenv, dec)
- | ABSTYPEdec(dbs, tbs_opt, dec2) =>
- let val (iBas'', dec'') = resolveDecOp iBas dec2 in
- (iBas'', (loc, ABSTYPEdec(dbs, tbs_opt, dec'')))
- end
- | EXCEPTIONdec ebs => (NILenv, dec)
- | LOCALdec(dec1, dec2) =>
- let val (iBas', dec') = resolveDecOp iBas dec1
- val (iBas'', dec'') = resolveDecOp (plusEnv iBas iBas') dec2
- in (iBas'', (loc, LOCALdec(dec',dec''))) end
- | OPENdec ids => (NILenv, dec)
- | EMPTYdec => (NILenv,dec)
- | SEQdec(dec1, dec2) =>
- let val (iBas', dec') = resolveDecOp iBas dec1
- val (iBas'', dec'') = resolveDecOp (plusEnv iBas iBas') dec2
- in (plusEnv iBas' iBas'', (loc, SEQdec(dec',dec''))) end
- | FIXITYdec(status, ids) =>
- (foldL (fn id => fn env => bindInEnv env id status) NILenv ids, dec)
-
- and resolveValBindOp iBas (ValBind(pat, exp)) =
- ValBind(resolvePatOp iBas pat, resolveExpOp iBas exp)
- ;
-
- val piRef = mkPrimInfo 1 MLPref;
-
- fun mkPrimStatus arity name =
- PRIMname(mkPrimInfo arity (findPrimitive arity name))
- ;
-
- fun resolveExpCon cBas (exp as (loc, exp')) =
- case exp' of
- SCONexp _ => exp
- | VARexp(ref (RESve ii)) =>
- let val {qualid, info} = ii
- val {idKind, ... } = info
- val cs = lookup_cBas cBas ii
- val {qualid=cs_qualid, ...} = cs
- in
- case #info cs of
- VARname REGULARo =>
- (idKind := { qualid=cs_qualid, info=VARik }; exp)
- | VARname ovltype =>
- (loc, VARexp(ref (OVLve (ii, ovltype, newUnknown()))))
- | PRIMname pi =>
- (idKind := { qualid=cs_qualid, info=PRIMik pi }; exp)
- | CONname ci =>
- (idKind := { qualid=cs_qualid, info=CONik ci }; exp)
- | EXNname ei =>
- (idKind := { qualid=cs_qualid, info=EXCONik ei }; exp)
- | REFname =>
- (idKind := { qualid=cs_qualid, info=PRIMik piRef }; exp)
- end
- | VARexp(ref (OVLve _)) => fatalError "resolveExpCon"
- | FNexp mrules =>
- (loc, FNexp (map (resolveMRuleCon cBas) mrules))
- | APPexp(e1, e2) =>
- (loc, APPexp(resolveExpCon cBas e1, resolveExpCon cBas e2))
- | LETexp(dec, body) =>
- let val (cBas', dec') = resolveDecCon cBas false dec
- in (loc, LETexp(dec', resolveExpCon (plusEnv cBas cBas') body)) end
- | RECexp(ref (RECre fs)) =>
- (loc, RECexp(ref (RECre (map_fields (resolveExpCon cBas) fs))))
- | RECexp(ref (TUPLEre _)) => fatalError "resolveExpCon"
- | VECexp es =>
- (loc, VECexp (map (resolveExpCon cBas) es))
- | PARexp e =>
- (loc, PARexp (resolveExpCon cBas e))
- | INFIXexp es => fatalError "resolveExpCon"
- | TYPEDexp(e,ty) =>
- (loc, TYPEDexp(resolveExpCon cBas e, ty))
- | ANDALSOexp(e1, e2) =>
- (loc, ANDALSOexp(resolveExpCon cBas e1, resolveExpCon cBas e2))
- | ORELSEexp(e1, e2) =>
- (loc, ORELSEexp(resolveExpCon cBas e1, resolveExpCon cBas e2))
- | HANDLEexp(e, mrules) =>
- (loc, HANDLEexp(resolveExpCon cBas e,
- map (resolveMRuleCon cBas) mrules))
- | RAISEexp e =>
- (loc, RAISEexp(resolveExpCon cBas e))
- | IFexp(e0, e1, e2) =>
- (loc, IFexp(resolveExpCon cBas e0, resolveExpCon cBas e1,
- resolveExpCon cBas e2))
- | WHILEexp(e1, e2) =>
- (loc, WHILEexp(resolveExpCon cBas e1, resolveExpCon cBas e2))
- | SEQexp(e1,e2) =>
- (loc, SEQexp(resolveExpCon cBas e1, resolveExpCon cBas e2))
-
- and resolveMRuleCon cBas (MRule(pats, exp)) =
- let val pats' = map (resolvePatCon cBas) pats
- val cBas' = foldL addPatVars cBas pats'
- in MRule(pats', resolveExpCon cBas' exp) end
-
- and resolveDecCon cBas onTop (dec as (loc, dec')) =
- case dec' of
- VALdec (tvs, (pvbs, rvbs)) =>
- let val (cBas', pvbs') = resolveValBindCon cBas pvbs
- val (cBas'', rvbs') = resolveRecValBindCon cBas rvbs
- in (plusEnv cBas' cBas'', (loc, VALdec (tvs, (pvbs', rvbs')))) end
- | PRIM_VALdec pbs =>
- (foldL addPrimVal NILenv (collectPrim pbs), dec)
- | FUNdec _ => fatalError "resolveDecCon"
- | TYPEdec _ => (NILenv, dec)
- | PRIM_TYPEdec _ => (NILenv, dec)
- | DATATYPEdec(dbs, _) =>
- (foldL addCon NILenv (collectCon dbs), dec)
- | ABSTYPEdec(dbs, tbs_opt, dec2) =>
- let val cBas' = foldL addCon NILenv (collectCon dbs)
- val (cBas'', dec'') = resolveDecCon (plusEnv cBas cBas') onTop dec2
- in (cBas'', (loc, ABSTYPEdec(dbs, tbs_opt, dec''))) end
- | EXCEPTIONdec ebs =>
- (foldL addExCon NILenv (collectExCon cBas onTop ebs), dec)
- | LOCALdec(dec1, dec2) =>
- let val (cBas', dec') = resolveDecCon cBas onTop dec1
- val (cBas'', dec'') = resolveDecCon (plusEnv cBas cBas') onTop dec2
- in (cBas'', (loc, LOCALdec(dec',dec''))) end
- | OPENdec ids =>
- let val cBas' =
- foldL (fn id => fn acc =>
- bindTopInEnv acc (#uConBasis (findAndMentionSig loc id)))
- NILenv ids
- in (cBas', dec) end
- | EMPTYdec => (NILenv, dec)
- | SEQdec(dec1, dec2) =>
- let val (cBas', dec') = resolveDecCon cBas onTop dec1
- val (cBas'', dec'') = resolveDecCon (plusEnv cBas cBas') onTop dec2
- in (plusEnv cBas' cBas'', (loc, SEQdec(dec',dec''))) end
- | FIXITYdec _ => (NILenv, dec)
-
- and resolveValBindCon cBas vbs =
- let val pats = map (fn ValBind(p,_) => resolvePatCon cBas p) vbs
- val cBas' = foldL addPatVars NILenv pats
- val exps = map (fn ValBind(_,e) => resolveExpCon cBas e) vbs
- val vbs' = map2 (fn p => fn e => ValBind(p,e)) pats exps
- in (mkHashEnv (length pats) cBas', vbs') end
-
- and resolveRecValBindCon cBas vbs =
- let val pats = map (fn ValBind(p,_) => resolvePatCon cBas p) vbs
- val cBas' = foldL addPatVars NILenv pats
- val cBas'' = mkHashEnv (length pats) cBas'
- val rec_cBas = plusEnv cBas cBas''
- val exps = map (fn ValBind(_,e) => resolveExpCon rec_cBas e) vbs
- val vbs' = map2 (fn p => fn e => ValBind(p,e)) pats exps
- in (cBas'', vbs') end
-
- and collectPrimInPB (ii, ty, arity, name) =
- let val {qualid, ...} = ii
- val {id, ...} = qualid
- val q = mkGlobalName id
- in (id, { qualid=q, info=(mkPrimStatus arity name) }) end
-
- and collectPrim pbs = map collectPrimInPB pbs
-
- and collectConInCB (ConBind(ii, ty_opt)) =
- let val {qualid, info} = ii
- val ci = mkConInfo()
- val q = mkGlobalName (#id qualid)
- in
- #idKind info := { qualid=q, info=CONik ci };
- (* If conArity = 1, it may be updated later for greedy constructors. *)
- (case ty_opt of
- SOME _ => setConArity ci 1
- | NONE => setConArity ci 0);
- { qualid=q, info=ci }
- end
-
- and collectCon dbs =
- concat( map (fn (_,_,cbs) => map collectConInCB cbs) dbs )
-
- and collectExCon cBas onTop ebs =
- map (collectExConInEB cBas onTop) ebs
-
- and collectExConInEB cBas onTop = fn
- EXDECexbind(ii, ty_opt) =>
- let val {qualid, info} = ii
- val {id, ...} = qualid
- val ei = mkExConInfo()
- val q = mkGlobalName id
- in
- #idKind info := { qualid=q, info=EXCONik ei };
- (case ty_opt of
- SOME _ => setExConArity ei 1
- | NONE => setExConArity ei 0);
- if onTop then
- setExConTag ei (SOME (q, newExcStamp()))
- else ();
- (id, { qualid=q, info=ei })
- end
- | EXEQUALexbind(ii, ii') =>
- let val {qualid, info} = ii
- val {id, ...} = qualid
- val {qualid=qualid', info=info'} = ii'
- val {idLoc=loc', ...} = info'
- val cs = lookup_cBas cBas ii'
- in
- case #info cs of
- VARname _ => errorMsg loc'
- ("Variable "^showQualId qualid' ^" is used as an exception name")
- | PRIMname _ => errorMsg loc'
- ("Primitive "^showQualId qualid' ^" is used as an exception name")
- | CONname _ => errorMsg loc'
- ("Constructor "^showQualId qualid' ^" is used as an exception name")
- | EXNname ei' =>
- let val q = mkGlobalName id in
- #idKind info' := { qualid= #qualid cs, info=EXCONik ei' };
- #idKind info := { qualid=q, info=EXCONik ei' };
- (id, { qualid=q, info=ei' })
- end
- | REFname => errorMsg loc'
- "`ref' is used as an exception name"
- end
- ;
-
- (* --- resolveToplevelDec --- *)
-
- fun resolveToplevelDec dec =
- let val (iBas', dec') = resolveDecOp (mkGlobalInfixBasis()) dec
- val (cBas', dec'') = resolveDecCon (mkGlobalConBasis()) true dec'
- in
- checkDec true dec'';
- (iBas', cBas', dec'')
- end
- ;
-
- (* --- Signatures --- *)
-
- fun collectExConInED cBas (ii, ty_opt) =
- let val {qualid, info} = ii : IdInfo
- val {id, ...} = qualid
- val ei = mkExConInfo()
- val q = mkGlobalName id
- in
- #idKind info := { qualid=q, info=EXCONik ei };
- (case ty_opt of
- SOME _ => setExConArity ei 1
- | NONE => setExConArity ei 0);
- setExConTag ei (SOME (q, 0));
- (id, { qualid=q, info=ei })
- end
- ;
-
- fun collectExConInEDs cBas eds =
- map (collectExConInED cBas) eds
- ;
-
- fun resolveSpecOp (iBas : InfixBasis) (spec as (loc, spec')) =
- case spec' of
- VALspec _ => NILenv
- | PRIM_VALspec _ => NILenv
- | TYPEDESCspec _ => NILenv
- | TYPEspec _ => NILenv
- | DATATYPEspec _ => NILenv
- | EXCEPTIONspec eds => NILenv
- | LOCALspec(spec1, spec2) =>
- let val iBas' = resolveSpecOp iBas spec1
- val iBas'' = resolveSpecOp (plusEnv iBas iBas') spec2
- in iBas'' end
- | OPENspec ids => NILenv
- | EMPTYspec => NILenv
- | SEQspec(spec1, spec2) =>
- let val iBas' = resolveSpecOp iBas spec1
- val iBas'' = resolveSpecOp (plusEnv iBas iBas') spec2
- in plusEnv iBas' iBas'' end
- ;
-
- fun collectVar vds = map (fn (ii : IdInfo, _) => #id(#qualid ii)) vds;
-
- fun resolveSpecCon cBas (spec as (loc, spec')) =
- case spec' of
- VALspec vds =>
- foldL addVar NILenv (collectVar vds)
- | PRIM_VALspec pbs =>
- foldL addPrimVal NILenv (collectPrim pbs)
- | TYPEDESCspec _ => NILenv
- | TYPEspec _ => NILenv
- | DATATYPEspec(dbs, _) =>
- foldL addCon NILenv (collectCon dbs)
- | EXCEPTIONspec eds =>
- foldL addExCon NILenv (collectExConInEDs cBas eds)
- | LOCALspec(spec1, spec2) =>
- let val cBas' = resolveSpecCon cBas spec1
- val cBas'' = resolveSpecCon (plusEnv cBas cBas') spec2
- in cBas'' end
- | OPENspec ids =>
- foldL (fn id => fn acc =>
- bindTopInEnv acc (#uConBasis (findAndMentionSig loc id)))
- NILenv ids
- | EMPTYspec => NILenv
- | SEQspec(spec1, spec2) =>
- let val cBas' = resolveSpecCon cBas spec1
- val cBas'' = resolveSpecCon (plusEnv cBas cBas') spec2
- in plusEnv cBas' cBas'' end
- ;
-
- (* --- resolveToplevelSpec --- *)
-
- fun resolveToplevelSpec spec =
- let val () = checkSpec true spec
- val iBas' = resolveSpecOp (mkGlobalInfixBasis()) spec
- val cBas' = resolveSpecCon (mkGlobalConBasis()) spec
- in (iBas', cBas') end
- ;
-